angular
    .module('web')
    .factory('DiffModal', [
      '$uibModal',
      function($modal) {
        return {
        /**
         * @param title
         * @param originalContent
         * @param content
         * @param callback
         * @param editable
         */
          show: function(title, originalContent, content, callback, editable) {
            editable = editable !== false;

            $modal.open({
              templateUrl: 'components/services/diff-modal.html',
              controller: 'diffModalCtrl',
              size: 'lg',
              resolve: {
                title: function() {
                  return title || 'Diff';
                },
                editable: function() {
                  return editable;
                },
                originalContent: function() {
                  return originalContent;
                },
                content: function() {
                  return content;
                },
                callback: function() {
                  return function(v) {
                    if (editable) { callback(v); } else { callback(); }
                  };
                }
              }
            });
          }
        };
      }
    ])
    .controller('diffModalCtrl', [
      '$scope',
      '$uibModalInstance',
      '$timeout',
      'title',
      'editable',
      'originalContent',
      'content',
      'callback',
      function(
          $scope,
          $modalInstance,
          $timeout,
          title,
          editable,
          originalContent,
          content,
          callback
      ) {
        angular.extend($scope, {
          title: title || 'Diff',
          originalContent: originalContent,
          content: content,
          initUI: initUI,
          editable: editable,

          ok: ok,
          cancel: cancel
        });

        var editor;

        function initUI() {
          $timeout(function() {
            editor = CodeMirror.MergeView(document.getElementById('diff-view'), {
              value: content,
              origLeft: originalContent,
              // orig:  content,
              lineNumbers: true,
              mode: 'javascript',
              highlightDifferences: true,
              connect: 'align',
              collapseIdentical: true,

              // 不可编辑
              allowEditingOriginals: false,
              revertButtons: false
            });
          }, 100);
        }

        function cancel() {
          $modalInstance.dismiss('close');
        }

        function ok() {
          callback(editor.editor().getValue());
          $modalInstance.dismiss('close');
        }
      }
    ]);
